/*
 * @lc app=leetcode.cn id=82 lang=java
 *
 * [82] 删除排序链表中的重复元素 II
 *
 * https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/description/
 *
 * algorithms
 * Medium (50.21%)
 * Likes:    464
 * Dislikes: 0
 * Total Accepted:    87.5K
 * Total Submissions: 173.8K
 * Testcase Example:  '[1,2,3,3,4,4,5]'
 *
 * 给定一个排序链表，删除所有含有重复数字的节点，只保留原始链表中 没有重复出现 的数字。
 * 
 * 示例 1:
 * 
 * 输入: 1->2->3->3->4->4->5
 * 输出: 1->2->5
 * 
 * 
 * 示例 2:
 * 
 * 输入: 1->1->1->2->3
 * 输出: 2->3
 * 
 */

// @lc code=start
/**
 * Definition for singly-linked list. public class ListNode { int val; ListNode
 * next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val,
 * ListNode next) { this.val = val; this.next = next; } }
 */
public ListNode deleteDuplicates(ListNode head) {
        ListNode dummy=new ListNode();
        ListNode tail=dummy;
        ListNode temp=head;
        while(temp!=null){
            if(dummy==tail||tail.val!=temp.val){
                int tempVal=temp.val;
                boolean isAgin=false;
                 ListNode cur=temp.next;
                 //插入数据前逐个比较是否和链表下一个节点有重复,直到没有重复
                while(cur!=null&&cur.val==tempVal){
                    cur=cur.next;
                    isAgin=true;
                }
                //跳到第一个不重复的节点，重新开始循环
                if(isAgin){
                    temp=cur;
                    continue;
                }
                //尾插法
                tail.next=temp;
                tail=temp;
            }
            temp=temp.next;
        }
        //尾指针需要置为null,否则可能出现最后一个入链表的节点还指向另外的节点，导致有脏数据。
        tail.next=null;
        return dummy.next;
}